const Koa=require("koa");
const path=require("path");
const logger=require("koa-logger");//产生日志记录
const onerror=require("koa-onerror");//错误链接和转换显示功能
const serve=require("koa-static");
const router=require("./router");
const koaBody=require("koa-body");
const token=require("jsonwebtoken");
const jwt=require("koa-jwt");



const app=new Koa();
app.use(logger());//日志：记录开发中所有的操作流程，当开发出现错误时候，可以快速完成定位以及触发错误的源头和执行过程
onerror(app);//错误显示转换

let staticPath=path.join(__dirname,"./public/");
app.use(serve(staticPath));




app.use(koaBody({
    multipart:true,//支持文件上传
    formidable:{
        uploadDir:path.join(__dirname,"./public/upload"),//设置上传文件由二进制转换成文件后的服务器存放目录，文件存储时候会完成重新命名操作
        keepExtensions:true//设置保留上传文件类型的后缀，默认false
    }
}));

app.use(async function(ctx,next){
    console.log("-------------------");
    // ctx.set("需要补充的响应头","允许的跨域服务器");
    // ctx.set("Access-Control-Allow-Origin","http://127.0.0.1:5500");
    ctx.set("Access-Control-Allow-Origin","*");

    //HTTP复杂请求
    // 允许跨域的请求方法的类型
    ctx.set("Access-Control-Allow-Methods","GET,POST,OPTIONS,PUT,DELETE,PATCH");
    //允许跨域的请求头的值
    ctx.set("Access-Control-Allow-Headers","Content-Type,Authorization,aa");

    if(ctx.method=="OPTIONS"){
        ctx.body="";
    }else{
        await next();
    }


});

let tokenConfig={
    sign:token.sign,
    secret:"itany secret"
};

//新增的中间件
app.use(async function(ctx,next){
    try{
        ctx.token=tokenConfig;
        await next();
    }catch(error){
        console.log("--------------------")
        if(error.status==401){
            ctx.body={
                state:false,
                msg:"未授权"
            }
        }else{
            throw error;//抛出错误
        }
    }

});

//判断授权
app.use(jwt({ secret: 'itany secret' }).unless({ path: [/^\/test/] }));


/* 
router是路由对象，用于提供定义时地址和回调函数之间的对应关系
router完成关系定义后，由router.routes()方法指向完成路由表的生成
    路由表->一段由js的路由和方法对应的判断逻辑 */
app.use(router.testRouter.routes());
app.use(router.userRouter.routes());
app.listen(3000);